home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 422_02 / misc / roboface.c < prev    next >
C/C++ Source or Header  |  1994-03-20  |  2KB  |  111 lines

  1. /*
  2.  * This function draws a very crude "robot" face on the PC video
  3.  * screen, using block characters on an 80x25 matrix. In addition
  4.  * to entertaining children, it shows some simple techniques for
  5.  * drawing lines, boxes and circles, which could be applied to
  6.  * higher resolution graphics modes.
  7.  *
  8.  * Compile command: cc roboface -fop
  9.  */
  10.  
  11. #include <stdio.h>        /* Standard I/O definitions */
  12. #include <video.h>        /* Video    I/O definitions */
  13.  
  14. #define    PCHR    0xDB
  15.  
  16. /*
  17.  * Main program, draw the face
  18.  */
  19. main()
  20. {
  21.     int i;
  22.  
  23.     vopen();
  24.     vcursor_off();
  25.     box(1, 0, 77, 24);
  26.     for(i=1; i < 5; ++i) {
  27.         circle(17, 8, i);
  28.         circle(60, 8, i); }
  29.     circle(17, 8, 6);
  30.     circle(60, 8, 6);
  31.     line(38, 9, 42, 13);
  32.     line(38, 9, 34, 13);
  33.     line(35, 13, 41, 13);
  34.     box(24, 18, 53, 21);
  35.     vgetc();
  36.     vcursor_line();
  37.     vclscr();
  38. }
  39.  
  40. /*
  41.  * Draw a line from point (x1, y1) to (x2, y2)
  42.  */
  43. line(x1, y1, x2, y2)
  44.     int x1, y1, x2, y2;
  45. {
  46.     int i, w, h;
  47.  
  48.     /* If 'X' is greater, increment through 'X' coordinate */
  49.     if((w = abs(x1 - x2)) >= (h = abs(y1 - y2))) {
  50.         if(x1 > x2) {
  51.             i = x1;
  52.             x1 = x2;
  53.             x2 = i;
  54.             i = y1;
  55.             y1 = y2;
  56.             y2 = i; }
  57.         h = y2 - y1;
  58.  
  59.         for(i=0; i < w; ++i) {
  60.             vgotoxy(x1+i, y1+((i*h) / w));
  61.             vputc(PCHR); } }
  62.     /* If 'Y' is greater, increment through 'Y' coordinate */
  63.     else {
  64.         if(y1 > y2) {
  65.             i = x1;
  66.             x1 = x2;
  67.             x2 = i;
  68.             i = y1;
  69.             y1 = y2;
  70.             y2 = i; }
  71.         w = x2 - x1;
  72.         for(i=0; i < h; ++i) {
  73.             vgotoxy(x1+((i*w)/h), y1+i);
  74.             vputc(PCHR); } }
  75.  
  76.     vgotoxy(x2, y2);
  77.     vputc(PCHR);
  78. }
  79.  
  80. /*
  81.  * Draw a box with opposite corners (x1, y1) to (x2, y2)
  82.  */
  83. box(x1, y1, x2, y2)
  84.     int x1, y1, x2, y2;
  85. {
  86.     line(x1, y1, x2, y1);
  87.     line(x1, y1, x1, y2);
  88.     line(x2, y1, x2, y2);
  89.     line(x1, y2, x2, y2);
  90. }
  91.  
  92. /*
  93.  * Draw a circle about point (x, y) of radus (r)
  94.  */
  95. circle(x, y, r)
  96.     int x, y, r;
  97. {
  98.     int i, j, k, rs, lj;
  99.  
  100.     rs = (lj = r)*r;
  101.     for(i=0; i <= r; ++i) {
  102.         j = k = sqrt(rs - (i*i));
  103.         do {
  104.             vgotoxy(x+i, y+j); vputc(PCHR);
  105.             vgotoxy(x+i, y-j); vputc(PCHR);
  106.             vgotoxy(x-i, y+j); vputc(PCHR);
  107.             vgotoxy(x-i, y-j); vputc(PCHR); }
  108.         while(++j < lj);
  109.         lj = k; }
  110. }
  111.